package com.my.designPattern_old;

/**
 * 单例模式之三： 线程安全的写法
 * 将对singleton的null判断以及new的部分使用synchronized进行加锁。
 * 同时，对singleton对象使用volatile关键字进行限制，保证其对所有线程的可见性，并且禁止对其进行指令重排序优化。
 * 如此即可从语义上保证这种单例模式写法是线程安全的
 */
public class Singleton3 {

    private static volatile Singleton3 singleton3;

    private Singleton3(){

    }

    private static Singleton3 getSingleton3(){

        synchronized (Singleton3.class){
            if(singleton3 == null){
                return new Singleton3();
            }
        }
        return singleton3;
    }
}
